package com.victor.controller.app;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Timer;
import java.util.TimerTask;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import com.victor.entity.user.User;
import com.victor.service.UserService;
import com.victor.utils.CodeUtil;
import com.victor.utils.Msg;
import com.victor.utils.sms.SmsSend;
import com.victor.utils.wxlogin.SNSUserInfo;
import com.victor.utils.wxlogin.WxController;

/**
 * app端登录相关
 * 
 * @author zhangbin
 *
 */
@RestController
@RequestMapping("/app_login")
public class AppLogin_C {

	@Autowired
	private UserService userService;

	/**
	 * 登录 密码找回 密码更改 验证码有效期10分钟 银行卡验证 实名认证 验证码有效期5分钟
	 */
	// 定义定时器
	private Timer timer = new Timer();

	// 定义验证码list
	private static List<Map<String, Object>> codelist = new ArrayList<Map<String, Object>>();

	// app账号三号登录
	@RequestMapping("/appLogin")
	public Msg appLogin(String account_mobile_mail, String password) {
		User user = userService.appLoign(account_mobile_mail, password);
		if (user != null) {
			return Msg.success().add("user", user);
		}
		return Msg.fail();
	}

	// app手机号验证码登录 --- 登录验证码 ----- 10分钟验证码   传012
	@RequestMapping("/buildcode_10")
	public Msg buildcode_10(String mobile, int type) {
		// 0.登录(11301)
		// 1.密码找回(11302)
		// 2 密码更改(11303)

		if (mobile == null || mobile.equals("")) {
			return Msg.fail("手机号为空");
		}

		// 关闭timer
		timer.cancel();
		// new一个Timer
		timer = new Timer();

		Map<String, Object> m2 = new HashMap<String, Object>();
		// 生成验证码(6位随机的验证码)
		String random = String.valueOf((int) ((Math.random() * 9 + 1) * 100000));
		System.out.println(mobile + " ~~~" + random);
		// 第三方发送短息
		int result = 0;
		if (type == 0) {
			result = SmsSend.smsSendMessage(mobile, "11301", random);// 0.登录(11301)
		} else if (type == 1) {
			result = SmsSend.smsSendMessage(mobile, "11302", random); // 1.密码找回(11302)
		} else if (type == 2) {
			result = SmsSend.smsSendMessage(mobile, "11303", random);// 2. 密码更改(11303)
		} else if (type == 3) {
			result = SmsSend.smsSendMessage(mobile, "11304", random);// 3.银行卡验证(11304)
		} else if (type == 4) {
			result = SmsSend.smsSendMessage(mobile, "11305", random);// 4 实名认证(11305)
		} else {
			return Msg.fail("type错误");
		}

		if (result == 1) {
			// 删除该手机号在codelist中其他的验证信息
			CodeUtil.clearothermap(codelist, mobile);
			// 将随机验证码放入到全局map中
			m2.put("random", random);
			m2.put("mobile", mobile);
			codelist.add(m2);
			m2 = new HashMap<String, Object>();

			// 设置定时器2分钟清空mmmlist
			timer.schedule(new TimerTask() {
				public void run() {
					codelist.clear();
				}
			}, 10 * 60 * 1000);// 设定指定的时间time,此处为10*60*1000毫秒

			return Msg.success().add("code", random);
		} else {
			return Msg.fail("验证码三方发送失败");
		}
	}

	// 忘记密码--通过输入三号 查询该账号是否注册 返回手机号及邮箱
	@RequestMapping("/forgetPassword")
	public Msg forgetPassword(String account_mobile_mail) {
		User user = userService.getUserByAccount_mobile_mail(account_mobile_mail);
		if (user != null) {
			return Msg.success().add("user", user);
		}
		return Msg.fail("未查询到该用户");
	}

	// 找回密码（手机号和邮箱,密保问题统一方法） ----- 找回密码验证码 ---- 传userid和新密码 --- (验证码前端判断)
	@RequestMapping("/updPassword")
	public Msg updPassword(User user) {
		boolean updResult = userService.updateUser(user);
		return Msg.judge(updResult);
	}

	// 接收申诉信息并判断 修改新密码 返回申诉成功失败
	@RequestMapping("/appeal")
	public Msg appeal(User user) {//
		// 如果必填的是手机号
		if (user.getPhone() != null) {
			// 通过手机号查询user信息
			User user_data = userService.selByPhone(user.getPhone());
			if (user_data != null) {
				// 验证银行卡
				int i = userService.getBankcardYoN(user_data.getId(), user.getBankcard(), user.getJoinbank());
				// i=0 该userid不存在这张银行卡 i=1 银行卡验证成功
				if (i == 1) {
					// 验证姓名 身份证号
					if (user_data.getName().equals(user.getName()) && user_data.getIdcard().equals(user.getIdcard())) {
						user_data.setPassword(user.getPassword());// 将传入的密码更新到数据库中

						boolean updResult = userService.updateUser(user_data);
						return Msg.judge(updResult);
					}
				} else {
					return Msg.fail("申诉失败");
				}
			} else {
				return Msg.fail("未查询到该手机号对应的用户");
			}

			// 如果必填的是邮箱
		} else if (user.getMailbox() != null) {
			// 通过邮箱查询信息
			User user_data = userService.selByMail(user.getMailbox());

			if (user_data != null) {
				// 验证该userid是否存在这张银行卡
				int i = userService.getBankcardYoN(user_data.getId(), user.getBankcard(), user.getJoinbank());
				// i=0 该userid不存在这张银行卡 i=1 银行卡验证成功
				if (i == 1) {
					// 验证姓名 身份证号
					if (user_data.getName().equals(user.getName()) && user_data.getIdcard().equals(user.getIdcard())) {
						user_data.setPassword(user.getPassword());// 将传入的密码更新到数据库中

						boolean updResult = userService.updateUser(user_data);
						return Msg.judge(updResult);
					}
				} else {
					return Msg.fail("申诉失败");
				}
			} else {
				return Msg.fail("未查询到该手机号对应的用户");
			}
		}
		return Msg.fail("手机号和邮箱不能全为空");

	}

	// 查询注册的账号是否重复
	@RequestMapping("/validateAccount")
	public Msg validateAccount(String account) {
		if (account == null || account.isEmpty()) {
			return Msg.fail("入参失败");
		}
		User selByAccount = userService.selByAccount(account);
		if (selByAccount != null) {
			return Msg.fail("该账号已经被使用");
		}
		return Msg.success();
	}

	// 注册账号---查询手机号邮箱和账号是否重复
	@RequestMapping("/registerUser")
	public Msg registerUser(User user) {
		// 查询用户手机号是否已被注册
		User user_p = userService.selByPhone(user.getPhone());
		if (user_p != null) {
			return Msg.fail("该手机号注册过");
		}
		// 查询用户邮箱是否已被注册
		User user_m = userService.selByMail(user.getMailbox());
		if (user_m != null) {
			return Msg.fail("该邮箱注册过");
		}
		// 将用户信息添加入数据库
		boolean insert = userService.insert(user);
		return Msg.judge(insert);
	}

	// qq三方登录 TODO
	@RequestMapping("/appQQLogin")
	public Msg appQQLogin(String qqcode) {
		if (null == qqcode) {
			return Msg.fail();
		}
		User user = userService.qq(qqcode);
		return Msg.success().add("user", user);
	}

	// 微信三方登录 TODO
	@RequestMapping("/appWechatLogin")
	public Msg appWechatLogin(String wxcode) {
		if (null == wxcode || wxcode.isEmpty()) {
			return Msg.fail();
		}
		SNSUserInfo snsUserInfo = null;
		try {
			snsUserInfo = WxController.weixinLogin(wxcode);
			User user = userService.findByOpenid(snsUserInfo.getOpenId());
			if (user == null) {
				return Msg.fail("您尚未注册");
			}
			return Msg.success().add("user", user);

		} catch (Exception e) {
			return Msg.fail();
		}

	}

}
